/*
 * client_handler.h
 *
 *  Created on: 17.01.2012
 *      Author: knz
 */

#ifndef CLIENT_HANDLER_H_
#define CLIENT_HANDLER_H_

#include <cstring>

#include "json.h"

class ClientHandler;
class HistRow;

class ClientJsonListener: public JsonListener
{
public:
    ClientJsonListener(ClientHandler *obj);
    virtual void readyRead(JsonValuesMap *val);

    virtual void parseError(std::string sError);
private:
    ClientHandler *m_pMaster;

    // Битовые константы флагов
    static const unsigned short m_bId     = 0x01;
    static const unsigned short m_bDestId = 0x02;
    static const unsigned short m_bMsg    = 0x04;
    static const unsigned short m_bCmd    = 0x08;
    // Битовые константы групп
    static const unsigned short m_bgrId       = m_bId;
    static const unsigned short m_bgrMsg      = m_bDestId | m_bMsg;
    static const unsigned short m_bgrCmd      = m_bCmd;
    static const unsigned short m_bgrHistById = m_bCmd | m_bId;
};

enum ExecCode {EC_OK, EC_ERROR, EC_DISCONNECT, EC_STOP_BY_QUERY, EC_AGAIN};

class ClientHandler {
public:
    ClientHandler(int iClientDescriptor, std::string sClientIpAddress);
    virtual ~ClientHandler();

    int id() { return m_id; }
    void setId(int id) { m_id = id; }

    int descriptor() { return m_iDescriptor; }
    std::string ipAddress() { return m_sClientIpAddress; }
    ExecCode execAtom();

    void sendJsonMsg(std::string sMsg);
    void sendJsonHistory(int idFrom, const std::string &sMsg);

    friend class ClientJsonListener;
private:
    int   m_iDescriptor;
    std::string m_sClientIpAddress;
    int   m_id;
    char *m_pchInBuf;
    int   m_iInBufSize;

    JsonParser m_parser;
    ClientJsonListener *m_pListener;

    // печать буфера, состоящего из слепленных ASCIIZ строк
     void printInBuffer(const char *pchInBuf, int bufLen);
     // максимальная порция данных обрабатываемая за один раз
     // чем меньше порция, тем чаще реализуется возмжность вызова
     // диспетчерских функций сервера
     int m_iMaxDataSize;
};

#endif /* CLIENT_HANDLER_H_ */
